const StringDecoder = require('string_decoder').StringDecoder;
const decoder = new StringDecoder('utf8');

const buf = Buffer.from('我爱编程');

for (let i = 0; i < buf.length; i+=2) {
  const b = Buffer.allocUnsafe(2);
  // buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])
  buf.copy(b, 0, i);
  log(b.toString());   
}

for (let i = 0; i < buf.length; i+=2) {
  const b = Buffer.allocUnsafe(2);
  // buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])
  buf.copy(b, 0, i);
  log(decoder.write(b));   
}

// decoder 原理
// 上面的例子每次循环能读入两个字节
// 而组成一个中文需要三个字节 - utf8
// 因此第一次循环decode发现不能拼成汉字，因此缓存到内存
// 第二次循环将缓存的2个再加上1个拼出一个汉字，再将多余的2个再次缓存
// 以此类推

/**
 * 打印控制台
 * @param {*} args 
 */
function log(...args) {
  console.log.apply(console, args);
}